// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

// Nextafter32返回x之后到y的下一个可表示的float32值。
// 
// 特殊情况为：
// Nextafter32（x，x）=x 
// Nextafter32（NaN，y）=NaN 
// Nextafter32（x，NaN）=NaN 
func Nextafter32(x, y float32) (r float32) {
	switch {
	case IsNaN(float64(x)) || IsNaN(float64(y)): // 特殊情况
		r = float32(NaN())
	case x == y:
		r = x
	case x == 0:
		r = float32(Copysign(float64(Float32frombits(1)), float64(y)))
	case (y > x) == (x > 0):
		r = Float32frombits(Float32bits(x) + 1)
	default:
		r = Float32frombits(Float32bits(x) - 1)
	}
	return
}

// Nextafter返回x后向y的下一个可表示浮点64值。
// 
// 特殊情况为：
// Nextafter（x，x）=x 
// Nextafter（NaN，y）=NaN 
// Nextafter（x，NaN）=NaN 
func Nextafter(x, y float64) (r float64) {
	switch {
	case IsNaN(x) || IsNaN(y): // 特殊情况
		r = NaN()
	case x == y:
		r = x
	case x == 0:
		r = Copysign(Float64frombits(1), y)
	case (y > x) == (x > 0):
		r = Float64frombits(Float64bits(x) + 1)
	default:
		r = Float64frombits(Float64bits(x) - 1)
	}
	return
}
